﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Unimaq.FacturaDBS_Spring.LogicaNegocio
{
    public class CM_CO_Comprobante_InterfaseBLL
    {
        public int Registrar(Util.ContextoDBSpring ctx, Entidades.Spring.CM_CO_Comprobante_Interfase cmCabecera)
        {
            ADO.Spring_CM_CO_Comprobante_Interfase_ADO comprobanteADO =
                new ADO.Spring_CM_CO_Comprobante_Interfase_ADO();

            int resultado = 0;

            resultado = comprobanteADO.Registrar(ctx, cmCabecera);

            return resultado;
        }

        public int TR_Registrar(List<Entidades.Spring.CM_CO_Comprobante_Interfase> listaComprobante)
        {
            int result = 0;

            using(Util.ContextoDBSpring ctx = Util.ContextoDBSpring.GetContexto())
            {
                ctx.LoadTransaction();

                foreach(Entidades.Spring.CM_CO_Comprobante_Interfase l in listaComprobante)
                {
                    result += Registrar(ctx, l);
                }

                ctx.ConfirmarTx();
            }

            return result;
        }

        public int Registrar(Util.ContextoDBSpring ctx,  List<Entidades.Spring.CM_CO_Comprobante_Interfase> listaComprobante, Entidades.Spring.UNIMAQ_ProcesoCarga selectedProcesoCarga)
        {
            int result = 0;

            foreach (Entidades.Spring.CM_CO_Comprobante_Interfase l in listaComprobante)
            {
                l.ProcesoCarga = selectedProcesoCarga.Valor;
                result += Registrar(ctx, l);
            }

            return result;
        }

        public void AjustarMontos_CabeceraDetalle(List<Entidades.Spring.CM_CO_Comprobante_Interfase> listaCabecera, List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> listaCabeceraDetalle)
        {
            foreach (Entidades.Spring.CM_CO_Comprobante_Interfase cab in listaCabecera)
            {
                List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> query =
                    listaCabeceraDetalle.Where(
                        x => x.TipoComprobante == cab.TipoComprobante &&
                             x.SerieComprobante == cab.SerieComprobante &&
                             x.NumeroComprobante == cab.NumeroComprobante).ToList();

                if (query.Count > 0)
                {
                    decimal sumMontoAfecto = query.Sum(x => x.MontoAfecto);
                    decimal sumMontoImpuestoVentas = query.Sum(x => x.MontoImpuestoVentas);

                    if (cab.MontoAfecto != sumMontoAfecto)
                    {
                        //calculamos la diferencia
                        decimal diferenciaMontoAfecto = cab.MontoAfecto - sumMontoAfecto;
                        decimal beforeMontoAfecto = query.First(x => x.Linea == 1).MontoAfecto;
                        //ajustamos los montos
                        //sumamos/restamos la diferencia al ultimo elemento de la lista
                        query.First(x => x.Linea == 1).MontoAfecto = beforeMontoAfecto + diferenciaMontoAfecto;
                    }

                    if (cab.MontoImpuestoVentas != sumMontoImpuestoVentas)
                    {
                        //calculamos la diferencia
                        decimal diferenciaMontoImpuestos = cab.MontoImpuestoVentas - sumMontoImpuestoVentas;
                        decimal beforeMontoImpuestoVentas = query.First(x => x.Linea == 1).MontoImpuestoVentas;

                        //ajustamos montos
                        //sumamos/restamos la diferencia al ultimo elemento de la lista
                        query.First(x => x.Linea == 1).MontoImpuestoVentas = beforeMontoImpuestoVentas + diferenciaMontoImpuestos;
                    }
                }
            }
        }                

        public List<int> Registrar(List<Entidades.Spring.CM_CO_Comprobante_Interfase> listaSpring, List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> listaSpringDetalle)
        {
            CM_CO_ComprobanteDetalleBLL comprobanteDetalleBLL = new CM_CO_ComprobanteDetalleBLL();
            UNIMAQ_ProcesoCargaBLL unimaqProcesoCargaBLL = new UNIMAQ_ProcesoCargaBLL();

            List<int> result = new List<int>();

            Entidades.Spring.UNIMAQ_ProcesoCarga selectedProcesoCarga = unimaqProcesoCargaBLL.Obtener(new Entidades.Spring.UNIMAQ_ProcesoCarga() { Compania = "06000000" });

            if (selectedProcesoCarga != null)
            {
                int result3 = 0;
                result3 = selectedProcesoCarga.Valor;                

                using (Util.ContextoDBSpring ctx = Util.ContextoDBSpring.GetContexto())
                {
                    ctx.LoadTransaction();

                    int result1 = this.Registrar(ctx, listaSpring, selectedProcesoCarga);
                    result.Add(result1);

                    int result2 = comprobanteDetalleBLL.Registrar(ctx, listaSpringDetalle, selectedProcesoCarga);
                    result.Add(result2);                    

                    //actualizamos el contador de ProcesoCarga
                    selectedProcesoCarga.Valor++;
                    unimaqProcesoCargaBLL.Actualizar(ctx, selectedProcesoCarga);

                    result.Add(result3);

                    ctx.ConfirmarTx();
                } 
            }

            return result;
        }
    }
}
